home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / vdgear / src / file.c < prev    next >
Text File  |  1994-11-16  |  11KB  |  633 lines

  1. /*
  2.  *    VIDEO・GEAR
  3.  *    "file.c"
  4.  *    by Good-Chy
  5.  */
  6. #include    "video.h"
  7.  
  8. char    *name_p[256];
  9. char    att_p[256];
  10. char    sort_p[256];
  11. char    data_str[256];
  12. struct    find_t c_file;
  13. int        file_end, no;
  14. unsigned    drive;
  15. FILE    *fp_d;
  16.  
  17. /******************************************************************************
  18.  *    name
  19.  */
  20.  
  21. char    *ex_name(char *name)        /* 拡張子をとる */
  22.     {
  23.     int    i, len;
  24.  
  25.     len = strlen(name);
  26.  
  27.     for (i=0 ; i<len ; i++)
  28.         {
  29.         if (*(name+i) == '.')
  30.             {
  31.             *(name+i) = '\0';
  32.             break;
  33.             }
  34.         }
  35.     return name;
  36.     }
  37.  
  38. char    *cat_name(char *ex)        /* フルパスファイル名に拡張子を付ける */
  39.     {
  40.     char    *crrdir = NULL;
  41.  
  42.     crrdir = _getcwd(crrdir,256);
  43.     if (strlen(crrdir) > 3)    { strcat(crrdir,"\\"); }
  44.     strcat(crrdir,key_buff);
  45.     if (strcmp(ex,"") != 0)
  46.         { crrdir = strcat(ex_name(crrdir),ex); }
  47.  
  48.     return crrdir;
  49.     }
  50.  
  51. /******************************************************************************
  52.  *    load
  53.  */
  54.  
  55. void    str_fget(int len)
  56.     {
  57.     int    p;
  58.     char    c;
  59.     p = 0;
  60.  
  61.     do
  62.         {
  63.         c = getc(fp_d);
  64.         data_str[p] = c;
  65.         p++;
  66.         } while((c != '\0') && (p<len));
  67.     }
  68.  
  69. void    data_load_check()
  70.     {
  71.     char    *crrdir;
  72.  
  73.     crrdir = cat_name("");
  74.     if (NULL == (fp_d = fopen(crrdir,"rb")))
  75.         {
  76.         key_flag = 2;
  77.         err_window(1,220,217);
  78.         return;
  79.         }
  80.  
  81.     str_fget(11);
  82.     if (strcmp(data_str,"VIDEO_GEAR") != 0)
  83.         {
  84.         key_flag = 2;
  85.         err_window(2,220,217);
  86.         fclose(fp_d);
  87.         return;
  88.         }
  89.  
  90.     fclose(fp_d);
  91.     con_win(2);
  92.     }
  93.  
  94. void    data_load()
  95.     {
  96.     int    i;
  97.     char    c,*p;
  98.     char    *crrdir;
  99.  
  100.     close();
  101.     crrdir = cat_name(".VGS");
  102.     fp_d = fopen(crrdir,"rb");
  103.  
  104.     setmos(82);
  105.     all_clear();
  106.  
  107.     for ( ;; )
  108.         {
  109.         c = getc(fp_d);
  110.         if (feof(fp_d))    { break; }
  111.         else
  112.             {
  113.             str_fget(255);
  114.             switch(c)
  115.                 {
  116.                 case    1:        /* ビデオ画像 */
  117.                     {
  118.                     i = data_str[0] -1;
  119.                     data[i].effect.flag = 1;
  120.                     data[i].effect.effect = data_str[1]-1;
  121.                     data[i].effect.spimpose = data_str[2]-1;
  122.                     break;
  123.                     }
  124.  
  125.                 case    2:        /* パソコン画像 */
  126.                     {
  127.                     i = data_str[0] -1;
  128.                     data[i].picture.flag = 1;
  129.                     data[i].picture.effect = data_str[1]-1;
  130.                     data[i].picture.x = data_str[2]-1;
  131.                     data[i].picture.y = data_str[3]-1;
  132.                     strcpy(data[i].picture.name, data_str+4);
  133.                     break;
  134.                     }
  135.  
  136.                 case    3:        /* CD */
  137.                     {
  138.                     i = data_str[0] -1;
  139.                     data[i].cd.flag = 1;
  140.                     data[i].cd.track = data_str[1]-1;
  141.                     data[i].cd.state = data_str[2]-1;
  142.                     break;
  143.                     }
  144.  
  145.                 case    4:        /* 効果音 */
  146.                     {
  147.                     i = data_str[0] -1;
  148.                     data[i].sound.flag = 1;
  149.                     data[i].sound.vol = data_str[1]-1;
  150.                     strcpy(data[i].sound.name, data_str+2);
  151.                     break;
  152.                     }
  153.  
  154.                 case    5:        /* ミキシング */
  155.                     {
  156.                     i = data_str[0] -1;
  157.                     data[i].mixing.flag = 1;
  158.                     data[i].mixing.vol[0] = data_str[1]-1;
  159.                     data[i].mixing.vol[1] = data_str[2]-1;
  160.                     data[i].mixing.vol[2] = data_str[3]-1;
  161.                     break;
  162.                     }
  163.                 }
  164.             }
  165.         }
  166.     fclose(fp_d);
  167.  
  168.     EGB_writePage(egb_work,0x81);
  169.     crrdir = cat_name(".VGT");
  170.     p = tiff_load(crrdir);
  171.     put_vram((p+6),0,60,WORD(p+0),60+WORD(p+2));
  172.     EGB_writePage(egb_work,0);
  173.     free(p);
  174.  
  175.     setmos(81);
  176.     close();
  177.     step_print();
  178.     }
  179.  
  180. /******************************************************************************
  181.  *    save
  182.  */
  183.  
  184. void    str_fput()
  185.     {
  186.     int    p;
  187.     char    c;
  188.     p = 0;
  189.  
  190.     do
  191.         {
  192.         c = data_str[p];
  193.         putc(c,fp_d);
  194.         p++;
  195.         } while(c != '\0');
  196.     }
  197.  
  198. void    data_save_check()
  199.     {
  200.     char    *crrdir;
  201.  
  202.     crrdir = cat_name(".VGS");
  203.     if (NULL != (fp_d = fopen(crrdir,"rb")))
  204.         {
  205.         fclose(fp_d);
  206.         con_win(3);
  207.         }
  208.     else    
  209.         {
  210.         con_win(4);
  211.         }
  212.     }
  213.  
  214. void    data_save()
  215.     {
  216.     int    i;
  217.     char    *pic;
  218.     char    *crrdir = NULL;
  219.  
  220.     close();
  221.     crrdir = cat_name(".VGS");
  222.     if (NULL == (fp_d = fopen(crrdir,"wb")))
  223.         {
  224.         key_flag = 2;
  225.         err_window(3,220,217);
  226.         return;
  227.         }
  228.  
  229.     setmos(82);
  230.     strcpy(data_str,"VIDEO_GEAR");
  231.     str_fput();
  232.  
  233.     for (i=0 ; i<48 ; i++)
  234.         {
  235.  
  236.         if (data[i].effect.flag == 1)            /* ビデオ画像 */
  237.             {
  238.             data_str[0] = 1;
  239.             data_str[1] = i+1;
  240.             data_str[2] = data[i].effect.effect+1;
  241.             data_str[3] = data[i].effect.spimpose+1;
  242.             data_str[4] = '\0';
  243.             str_fput();
  244.             }
  245.  
  246.         if (data[i].picture.flag == 1)        /* パソコン画像 */
  247.             {
  248.             data_str[0] = 2;
  249.             data_str[1] = i+1;
  250.             data_str[2] = data[i].picture.effect+1;
  251.             data_str[3] = data[i].picture.x+1;
  252.             data_str[4] = data[i].picture.y+1;
  253.             strcpy(data_str+5,data[i].picture.name);
  254.             str_fput();
  255.             }
  256.  
  257.         if (data[i].cd.flag == 1)            /* CD */
  258.             {
  259.             data_str[0] = 3;
  260.             data_str[1] = i+1;
  261.             data_str[2] = data[i].cd.track+1;
  262.             data_str[3] = data[i].cd.state+1;
  263.             data_str[4] = '\0';
  264.             str_fput();
  265.             }
  266.  
  267.         if (data[i].sound.flag == 1)            /* 効果音 */
  268.             {
  269.             data_str[0] = 4;
  270.             data_str[1] = i+1;
  271.             data_str[2] = data[i].sound.vol+1;
  272.             strcpy(data_str+3,data[i].sound.name);
  273.             str_fput();
  274.             }
  275.  
  276.         if (data[i].mixing.flag == 1)            /* ミキシング */
  277.             {
  278.             data_str[0] = 5;
  279.             data_str[1] = i+1;
  280.             data_str[2] = data[i].mixing.vol[0]+1;
  281.             data_str[3] = data[i].mixing.vol[1]+1;
  282.             data_str[4] = data[i].mixing.vol[2]+1;
  283.             data_str[5] = '\0';
  284.             str_fput();
  285.             }
  286.         }
  287.     fclose(fp_d);
  288.  
  289.     EGB_writePage(egb_work,0x81);
  290.     pic = get_vram(32,0,60,319,239);
  291.     crrdir = cat_name(".VGT");
  292.     tiff_save(crrdir,pic, 320,180);
  293.     EGB_writePage(egb_work,0);
  294.     free(pic);
  295.     free(crrdir);
  296.  
  297.     setmos(81);
  298.     close();
  299.     }
  300.  
  301. /******************************************************************************
  302.  *    ファイルセレクタ-
  303.  */
  304.         
  305. char    *sub_name(char *name, char att)
  306.     {
  307.     static    char    tmp[14];
  308.     int    i;
  309.     char    *p;
  310.  
  311.     p = tmp;
  312.  
  313.     if ((att & 0x10) != 0)            /* サブディレクトリ */
  314.         {
  315.         *(p++) = '<';
  316.         while(*name != '\0')
  317.             {
  318.             *(p++) = *name;
  319.             name++;
  320.             }
  321.         *(p++) = '>';
  322.         *(p++) = '\0';
  323.         return tmp;
  324.         }
  325.         
  326.     for (i=0 ; i<9 ; i++)                /* ファイル名 */
  327.         {
  328.         if (*name == '.' || *name == '\0')
  329.             { *(p++) = ' '; }
  330.         else    { *(p++) = *name; name++; }
  331.         }
  332.     if (*name == '.')    { name++; }
  333.     for (i=0 ; i<3 ; i++)                /* 拡張子 */ 
  334.         {
  335.         if (*name == '\0')
  336.             { *(p++) = ' '; }
  337.         else    { *(p++) = *name; name++; }
  338.         }
  339.     *p = '\0';
  340.     return tmp;
  341.     }
  342.  
  343. int        ch_dir(char *name)
  344.     {
  345.     int        vx,vy;
  346.     setmos(82);
  347.     char    *crrdir = NULL;
  348.  
  349.     vx = win[active].wx;
  350.     vy = win[active].wy;
  351.     EGB_paintMode(egb_work,0x22);
  352.     box_full(vx+6,vy+26,vx+89,vy+110,4,4,0);
  353.  
  354.     crrdir = _getcwd(crrdir,256);
  355.     if (strlen(crrdir) > 3)    { strcat(crrdir,"\\"); }
  356.     strcat(crrdir,name);
  357.     if (_chdir(crrdir) == -1)
  358.         {
  359.         key_flag = 2;
  360.         err_window(4,220,217);
  361.         file_end = 0;
  362.         setmos(81);
  363.         return 1;
  364.         }
  365.     setmos(81);
  366.     free(crrdir);
  367.     return 0;
  368.     }
  369.  
  370. void    sort(int file_end)
  371.     {
  372.     int    i, counter=0;
  373.     for (i=0 ; i<file_end ; i++)
  374.         {
  375.         if ((att_p[i] & 0x10) != 0)
  376.             {
  377.             sort_p[counter] = i;
  378.             counter++;
  379.             }
  380.         }
  381.  
  382.     for (i=0 ; i<file_end ; i++)
  383.         {
  384.         if ((att_p[i] & 0x10) == 0)
  385.             {
  386.             sort_p[counter] = i;
  387.             counter++;
  388.             }
  389.         }
  390.     }
  391.  
  392. void    nameset(int i)
  393.     {
  394.     if (NULL != (name_p[i] = malloc(13)))
  395.         {
  396.         strcpy(name_p[i], c_file.name);
  397.         att_p[i] = c_file.reserved[21];
  398.         }
  399.     }
  400.  
  401. void    setdir()
  402.     {
  403.     setmos(82);
  404.     key_buff_clear();
  405.  
  406.     int        i = 1;
  407.     if (_dos_findfirst("*.*", _A_SUBDIR, &c_file) != 0)
  408.         {
  409.         file_end = 0;
  410.         setmos(81);
  411.         return;
  412.         }
  413.  
  414.     else
  415.         {
  416.         nameset(0);
  417.         while(_dos_findnext(&c_file) == 0)
  418.             {
  419.             nameset(i);
  420.             i++;
  421.             }
  422.         }
  423.  
  424.     file_end = i;
  425.     sort(file_end);
  426.     setmos(81);
  427.     }
  428.  
  429. void    dsp_drive()
  430.     {
  431.     int        vx,vy;
  432.     char    drv[2];
  433.     _dos_getdrive(&drive);
  434.     drv[0] = 'A'+drive-1 ; drv[1] = '\0';
  435.     vx = win[active].wx;
  436.     vy = win[active].wy;
  437.     EGB_paintMode(egb_work,0x22);
  438.     box_full(vx+140,vy+26,vx+161,vy+47,4,4,0);
  439.     sprint(drv,vx+140,vy+48,15,0,46,23,0);
  440.     }
  441.  
  442. void    dsp_name(int flag)
  443.     {
  444.     int        i = 0, j, k, vx,vy;
  445.     vx = win[active].wx;
  446.     vy = win[active].wy;
  447.  
  448.     if (file_end > 0)
  449.         {
  450.         MOS_disp(0);
  451.         k = MOS_getControl();
  452.         MOS_setControl(k & 0xfffffffe);
  453.         EGB_paintMode(egb_work,0x22);
  454.  
  455.         switch(flag)
  456.             {
  457.             case    0:        /* ファイル名を全部表示 */
  458.                 {
  459.                 while((i<6) && (i<file_end))
  460.                     {
  461.                     j = sort_p[i+no];
  462.                     box_full(vx+6,i*14+vy+26,vx+89,i*14+vy+39,4,4,0);
  463.                     sprint(sub_name(name_p[j],att_p[j]),
  464.                                 vx+12,i*14+vy+39,15,8,12,12,0);
  465.                     i++;
  466.                     }
  467.                 break;
  468.                 }
  469.  
  470.             case    1:        /* 上にスクロ-ル */
  471.                 {
  472.                 j = sort_p[no];
  473.                 scroll(vx+6,vy+26,vx+89,vy+110,0,14);
  474.                 box_full(vx+6,vy+26,vx+89,vy+39,4,4,0);
  475.                 sprint(sub_name(name_p[j],att_p[j]),
  476.                             vx+12,vy+39,15,8,12,12,0);
  477.                 break;
  478.                 }
  479.             case    2:        /* 下にスクロ-ル */
  480.                 {
  481.                 j = sort_p[no+5];
  482.                 scroll(vx+6,vy+26,vx+89,vy+110,0,-14);
  483.                 box_full(vx+6,vy+96,vx+89,vy+110,4,4,0);
  484.                 sprint(sub_name(name_p[j],att_p[j]),
  485.                             vx+12,vy+109,15,8,12,12,0);
  486.                 break;
  487.                 }
  488.             }
  489.         MOS_setControl(k);
  490.         MOS_disp(1);
  491.         }
  492.     }
  493.  
  494. void    dsp_dir()
  495.     {
  496.     setmos(82);
  497.     if (ch_dir(".") == 0)    { setdir(); }
  498.     no = 0;
  499.     dsp_name(0);
  500.     setmos(81);
  501.     }
  502.  
  503. void    ch_drive(int vector)
  504.     {
  505.     int        vx,vy;
  506.     unsigned    n_drive, c_drive, drives;
  507.  
  508.     key_buff_clear();
  509.     _dos_getdrive(&n_drive);
  510.  
  511.     do
  512.         {
  513.         n_drive += vector;
  514.         if (n_drive< 1)    { n_drive = 26; }
  515.         if (n_drive>26)    { n_drive =  1; }
  516.         _dos_setdrive(n_drive,&drives);
  517.         _dos_getdrive(&c_drive);
  518.         }
  519.     while(c_drive != n_drive);
  520.         
  521.     dsp_drive();
  522.     vx = win[active].wx;
  523.     vy = win[active].wy;
  524.     EGB_paintMode(egb_work,0x22);
  525.     box_full(vx+6,vy+26,vx+89,vy+110,4,4,0);
  526.     file_end = 0;
  527.     }
  528.  
  529. void    file()                /* file window が押された */
  530.     {
  531.     int    p;
  532.     p = win[active].last->number;
  533.     if (p<file_end)
  534.         {
  535.         if ((att_p[sort_p[p+no]] & 0x10) != 0)
  536.             {
  537.             if (ch_dir(name_p[sort_p[p+no]]) == 0)
  538.                     { setdir(); }
  539.             no = 0;
  540.             dsp_name(0);
  541.             }
  542.         else
  543.             {
  544.             key_buff_clear();
  545.             cursor_dsp(0);
  546.             strcpy(key_buff, name_p[sort_p[p+no]]);
  547.             key_cursor += strlen(key_buff);
  548.             sprint(key_buff,key_x+1,key_y+13,15,0,12,12,0);
  549.             cursor_dsp(1);
  550.             }
  551.         }
  552.     }
  553.  
  554. void    f_up()                /* "▲" が押された */
  555.     {
  556.     no--;
  557.     if (no<0)            { no = 0; }
  558.     else                { dsp_name(1); }
  559.     }
  560.  
  561. void    f_down()                /* "▼" が押された */
  562.     {
  563.     no++;
  564.     if (no>file_end-6)
  565.         {
  566.         no = file_end-6;
  567.         if (file_end<6)    { no = 0; }
  568.         }
  569.     else                { dsp_name(2); }
  570.     }
  571.  
  572. void    d_sub()                /* "≪" が押された */
  573.     {
  574.     ch_drive(-1);
  575.     }
  576.  
  577. void    d_add()                /* "≫" が押された */
  578.     {
  579.     ch_drive(1);
  580.     }
  581.  
  582. void    file_sel(int mode)
  583.     {
  584.     int    i;
  585.     char    *str;
  586.     BUTTON    *p;    
  587.  
  588.     if (mode != 3)    { close(); }
  589.  
  590.     p = window_open(220,180,199,119,390,97);
  591.  
  592.     for (i=0 ; i<6 ; i++)
  593.         {
  594.         p = create(p,6,i*14+27,83,12,1,file);
  595.         }
  596.     p = create(p, 94, 25,11,11,2,f_up);
  597.     p = create(p, 94,100,11,11,2,f_down);
  598.     p = create(p,126, 25,11,23,0,d_sub);
  599.     p = create(p,139, 25,23,23,0,dsp_dir);
  600.     p = create(p,164, 25,11,23,0,d_add);
  601.  
  602.     switch(mode)
  603.         {
  604.         case    0:
  605.             {
  606.             p = create(p,126, 94,32,17,0,data_load_check);
  607.             str = "読み込み";        break;
  608.             }
  609.         case    1:
  610.             {
  611.             p = create(p,126, 94,32,17,0,data_save_check);
  612.             str = " 保存 ";        break;
  613.             }
  614.         case    2:
  615.             {
  616.             p = create(p,126, 94,32,17,0,picture_load);
  617.             str = " 画像 ";        break;
  618.             }
  619.         case    3:
  620.             {
  621.             p = create(p,126, 94,32,17,0,sound_name);
  622.             str = " 効果音 ";        break;
  623.             }
  624.         }
  625.  
  626.     p = create(p,163, 94,31,17,0,close);
  627.     sprint(str,348,245,15,8,12,12,8);
  628.  
  629.     key_start(win[active].wx+113,win[active].wy+72,12);
  630.     dsp_drive();
  631.     dsp_dir();
  632.     }
  633.